package main

/**go语言中的数据类型有如下几种*/
/**
  分为平台相关和平台不相关的类型
*/
import "fmt"

/**
  go语言中的数据类型有如下几种：
   1。整形
   2.浮点类型
   3.字符串
   4.指针
*/
func main() {
	Integer()
	Float()
	String()
	Const()
}

/**
  go语言中有13种整型
  其中有2种只是名字不同，实质是一样的，所以，实质上go语言有11种整形
（1）int ：依赖不同平台下的实现，可以是int32或int64
（2）int8 :  (-128->127)
（3）int16: (-32768->32767)
（4）int32: (-2 147 483 648->2 147 483 647)
（5）int64 :(-9 223 372 036 854 775 808->9 223 372 036 854 775 807)
（6）unit : 依赖不同平台下的实现，可以是int32或int64
（7）unit8 (又名byte):  (0->255)
（8）unit16 :   (0->65535)
（9）unit32 (又名rune):　   (0->4 294 967 295)
（10）unit64 : (0->18 446 744 073 709 551 615)
（11）unitptr : 恰好容纳指针值的类型，对32位平台是unit32，对64位平台是unit64
	1	byte - 与uint8相同
	2	rune - 与int32相同
	3	uint - 32或64位
	4	int - 与uint大小相同
	5	uintptr - 无符号整数，用于存储指针值的未解释位
注意：go语言中没有自动类型转换
*/
func Integer() {
	var number int8
	var number2 int32
	number = 98
	number2 = int32(number) //将int32转换成int8
	fmt.Println("int8类型的数据", number)
	fmt.Println("int32类型的数据", number2)
}

/**
go语言中的浮点类型
go语言有2种类型的浮点和两种类型的复数类型。
（1） float32(-3.402...×1038->3.402...×1038)
（2） float64(-1.797...×10308->+1.797...×10308)
（3） complex64( 实部、虚部都是一个float32 )
（4） complex128　 ( 实部、虚部都是一个float64 )
（PS：标准库math包中，包含了众多数学函数，其中所有函数均使用float64，
  标准库math/cmplx包含众多复数相关的数学函数,其中所有函数均使用complex128）
（PPS : 跟数学中一样，Go语言使用后缀 i 表示复数,例如 5 + 5.1i ）
*/
func Float() {
	var f32 float32
	var f64 float64
	f32 = 23.4
	f64 = float64(f32) //数据类型转换
	fmt.Println("float32类型的数据", f32)
	fmt.Println("float64类型的数据", f64)
}

/**字符串类型
Go语言的字符串是用UTF-8编码的变宽字符序列，每个字符都用一个或多个字节表示。这与Java不同，Java是采用UTF-16来表示，每个字符都对应2个字节。
（1）创建：一种是用双引号（"）括起来，它表示可解析的字符串，可以进行字符转义。另一种是用单引号（'）括起来，
它表示原生的字符串，可以包含除反引号之外的任何字符，当然也可以换行
*/
func String() {
	str1 := "it's a string"
	str2 := `it's a string` //反引号原生字符串
	fmt.Println(str1)
	fmt.Println(str2)
	//可以使用str[n:m]方式来截取字符串
	fmt.Println("部分字符串:", str1[1:6], "字符串长度:", len(str2))
	//可以通过加号连接字符串
	fmt.Println(str1 + str2[2:4])
	//字符串不可变性:s[0] = 'L'将错误
}

/**
因为Go的源文件都是用UTF-8编码，并且Go的文本字符串通常也是用UTF-8编码，因此我们可以在字符串值中使用Unicode码点
\a      响铃
\b      退格
\f      换页
\n      换行
\r      回车
\t      制表符
\v      垂直制表符
\'      单引号 (只用在 '\'' 形式的rune符号面值中)
\"      双引号 (只用在 "..." 形式的字符串面值中)
\\      反斜杠
*/

/**go语言中的常量*/
/**多个常量使用小括号 const()*/
func Const() {
	const Pi float64 = 3.14159265358979323846
	fmt.Println("半径为2的圆面积:", Pi*2*2)
}
